package ltd.flython.dlock.common;

import java.util.concurrent.TimeUnit;

/**
 * 分布式锁接口
 */
public interface DLock {

    /**
     * 每个锁都需要有一个名字
     * @return
     */
    String getName();

    /**
     * 尝试上锁，成功返回true，失败返回false，非宕机情况下，不会自动解锁，需要代码显式解锁
     */
    boolean tryLock();

    /**
     * 定时等待，尝试上锁
     * @param time
     * @param unit
     * @return
     * @throws InterruptedException
     */
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

    /**
     * 阻塞式上锁
     */
    void lock();

    /**
     * 设置延迟解锁，调用后分布式锁在设定的时间内解锁(无论有多少次重入)
     * @param time
     * @param unit
     * @return
     */
    void unlockDelayed(long time, TimeUnit unit);

    void forceUnlock();

    /**
     * 解锁一次
     * @return 剩余的重入锁次数
     */
    int unlock();

    void notifyHead();
}
